﻿using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using InvoiceInvoker.Logic;
using InvoiceInvoker.MvcUI.Helpers;

namespace InvoiceInvoker.MvcUI.Models
{
	public class SellerModel
	{
		[ScaffoldColumn(false)]
		public int Id { get; set; }

		[ScaffoldColumn(false)]
		[DisplayName("Nazwa użytkownika")]
		[StringLength(50, ErrorMessage = "Nazwa użytkownika może mieć co najwyżej 50 znaków")]
		public string UserName { get; set; }

		[DisplayName("Imię")]
		[StringLength(50, ErrorMessage = "Imię może mieć co najwyżej 50 znaków")]
		public string FirstName { get; set; }

		[DisplayName("Nazwisko")]
		[StringLength(50, ErrorMessage = "Nazwisko może mieć co najwyżej 50 znaków")]
		public string LastName { get; set; }

		[DisplayName("Nazwa firmy")]
		[StringLength(50, ErrorMessage = "Nazwa firmy może mieć co najwyżej 50 znaków")]
		public string CompanyName { get; set; }

		[DisplayName("Ulica")]
		[StringLength(50, ErrorMessage = "Ulica może mieć co najwyżej 50 znaków")]
		public string Street { get; set; }

		[DisplayName("Miasto")]
		[StringLength(50, ErrorMessage = "Miasto może mieć co najwyżej 50 znaków")]
		public string City { get; set; }

		[DisplayName("Kod pocztowy")]
		[StringLength(10, ErrorMessage = "Kod pocztowy może mieć co najwyżej 10 znaków")]
		public string PostalCode { get; set; }

		[DisplayName("Nazwa banku")]
		[StringLength(50, ErrorMessage = "Nazwa banku może mieć co najwyżej 50 znaków")]
		public string BankName { get; set; }

		[DisplayName("Numer konta")]
		[StringLength(50, ErrorMessage = "Numer konta może mieć co najwyżej 50 znaków")]
		public string BankAccountNumber { get; set; }

		[DisplayName("Swift")]
		[StringLength(20, ErrorMessage = "Swift może mieć co najwyżej 20 znaków")]
		public string BankSwift { get; set; }

		[DisplayName("NIP")]
		[StringLength(20, ErrorMessage = "NIP może mieć co najwyżej 20 znaków")]
		[CustomValidation(typeof(ValidationHelpers), "ValidateNip")]
		public string Nip { get; set; }

		[DisplayName("REGON")]
		[StringLength(20, ErrorMessage = "REGON może mieć co najwyżej 20 znaków")]
		[CustomValidation(typeof(ValidationHelpers), "ValidateRegon")]
		public string Regon { get; set; }

		[DisplayName("Format numeru faktury")]
		[StringLength(50, ErrorMessage = "Format numeru faktury może mieć co najwyżej 50 znaków")]
		[CustomValidation(typeof(ValidationHelpers), "ValidateInvoiceNumberFormat")]
		public string InvoiceNumberFormat { get; set; }

		[ScaffoldColumn(false)]
		[DisplayName("Numer ostatniej faktury")]
		[StringLength(50, ErrorMessage = "Numer ostatniej faktury może mieć co najwyżej 50 znaków")]
		public string LastInvoiceNumber { get; set; }

		public SellerModel()
		{ }

		public SellerModel(RegisteredSeller registeredSeller)
		{
			Id = registeredSeller.Id;
			UserName = registeredSeller.UserName;
			FirstName = registeredSeller.FirstName;
			LastName = registeredSeller.LastName;
			CompanyName = registeredSeller.CompanyName;
			Street = registeredSeller.Street;
			City = registeredSeller.City;
			PostalCode = registeredSeller.PostalCode;
			BankName = registeredSeller.BankName;
			BankAccountNumber = registeredSeller.BankAccountNumber;
			BankSwift = registeredSeller.BankSwift;
			Nip = registeredSeller.Nip;
			Regon = registeredSeller.Regon;
			InvoiceNumberFormat = registeredSeller.InvoiceNumberFormat;
			LastInvoiceNumber = registeredSeller.LastInvoiceNumber;
		}

		public RegisteredSeller ToRegisteredSeller()
		{
			RegisteredSeller result = new RegisteredSeller();
			result.Id = Id;
			result.UserName = UserName;
			result.FirstName = FirstName;
			result.LastName = LastName;
			result.CompanyName = CompanyName;
			result.Street = Street;
			result.City = City;
			result.PostalCode = PostalCode;
			result.BankName = BankName;
			result.BankAccountNumber = BankAccountNumber;
			result.BankSwift = BankSwift;
			result.Nip = Nip;
			result.Regon = Regon;
			result.InvoiceNumberFormat = InvoiceNumberFormat;
			result.LastInvoiceNumber = LastInvoiceNumber;

			return result;
		}
	}
}